package com.zhou.test.controller;

import com.zhou.test.pojo.User;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.multipart.MultipartFile;
import org.springframework.web.servlet.ModelAndView;

import java.io.File;
import java.io.IOException;
import java.io.InputStream;

// 常用注解介绍
//  @Controller + @ResponseBody
//  @Controller  是 springMVC注解, 用于负责处理web请求
//  @ResponseBody  表示 此方法放回 文本数据 而不是 视图名称

@RestController
public class AnnotationsUseDemoController {
    //TODO 相关注解 :
    //  @GetMapping;
    //  @PostMapping;
    //  @PutMapping;
    //  @DeleteMapping;
    //  @PatchMapping


    // TODO 获取请求参数相应注解
    //  @RequestParam ， 对应于 HTTP 请求的参数，自动转化为参数对应的类型。
    //  @RequestHeader，对应于 HTTP 请求头参数，自动转化为对应的类型。
    //  @RequestBody ， 自动将请求内容转为指定的对象 ， 默认使用 HtψMessageConverters来转化。
    //  @RequestPart，用于文件上传，对应于 HTTP 协议的 multipart/form-data 。


    // @RequestMapping  是 springMVC注解, 表示如果请求路径匹配, 注解方法会被调用
    // TODO 属性:
    //  value 请求的url 的路径,支持URL模板,正则表达式
    //  method: Http 请求 方法, get , post ,put 等等
    //  consumes: 允许的媒体类型 (Media Types) ,如 "application/json" ,对应请求的http 的 content-type
    //  produces ，相应的媒体类型，如 produces＝" application/json"， 对应于 HTTP 的 Accept 宇段。用户代理可处理的媒体类型
    //  params ， 请求的参数, 如 params＝"action=update"
    //  headers ， 请求的 HTTP 头的值 ，如 headers ＝ "myHeader=myValue" 。
    @RequestMapping(value = "say.html")
    public String say() {
        return "Hello  Spring  Boot say()";
    }

    // 请求地址 : http://localhost:8080/get/13
    @RequestMapping(value = "get/{id}")
    //TODO  可以将 URL 中的值映射到方法参数中。
    public String getId(@PathVariable("id") Long id) {
        return "uuserId :" + id;
    }

    // TODO URL 映射也可以使用$｛ ｝来获得系统的配置或者环境变量，通常用于 Controller 路径是通过
    //  配置文件设定的情况。
    //  url.query 对应 application.yml 文件下的值
    @RequestMapping(value = "/${url.query}")
    public String getApplication() {
        return "Hello  Spring  Boot getApplication()";
    }


    // 请求地址 :  http://localhost:8080/getRequestParam?name=abc&id= I
    @RequestMapping(value = "getRequestParam")
    //TODO @RequestParam 属性
    //  defaultValue ， 字符类型，如果 HTTP 参数没有提供，可以指定一个默认字符串， Spring类型转化为目标类型，如上一个例子，我们可以提供默认参数。
    //  value ，指明 HTTP 参数的名称。
    //  required, boolean 类型，声明此参数是否必须有，如果 HTTP 参数里没有 ， 则会抛出400 错误 。
    public String getRequestParam(@RequestParam(value = "id", defaultValue = "123") Integer id, @RequestParam(value = "name") String name) {
        return "id:" + id + "name:" + name;
    }

    // 可以将 HTTP 参数转为 JavaBean 对象， HTTP 参数的名字对应到 POJO 的属性名
    @PostMapping(value = "getBean")
    public User getBean(@RequestBody User user) {
        return user;
    }

    // 通过 MultipartFile 来处理文件上传：
    @PostMapping("/handleFormUpload")
    @ResponseBody
    public String handleFormUpload(String name, MultipartFile file) throws IOException {
        // 文件上传内容为空 ，或者就没有文件上传
        if (!file.isEmpty()) {
            // 获取上传的文件名字
            String fileName = file.getOriginalFilename();
            // 获取一个 InputStream
            InputStream ios = file.getInputStream();
            // 我取上传文件内容，转为字节数组：
            byte[] bytes = file.getBytes();
            // 文件上传的大小
            long size = file.getSize();
            // 保存上传文件到目标文件系统
            File saveFile = new File("E:\\work\\spring-boot2-demo\\test-1\\file");
            file.transferTo(saveFile);

            // 处理上传内容逻辑
            // ....
            return "success ";
        }
        return "failure";
    }


    // TODO 传参校验参考 Validation.md 文件
}
